package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class MyAspect6 {

    /**
     * execution(访问修饰符?  返回值  包名.类名.?方法名(方法参数) throws 异常?)
     * 其中带`?`的表示可以省略的部分
     * - 访问修饰符：可省略（比如: public、protected）
     * - 包名.类名： 可省略
     * - throws 异常：可省略（注意是方法上声明抛出的异常，不是实际抛出的异常）
     *
     * - `*` ：单个独立的任意符号，可以通配任意返回值、包名、类名、方法名、任意类型的一个参数，也可以通配包、类、方法名的一部分
     *      execution(* com.*service.*.update*(*))
     * - `..` ：多个连续的任意符号，可以通配任意层级的包，或任意类型、任意个数的参数
     *      execution(* com.itheima..DeptService.*(..))  ..主要用在这两方面：任意层级的包，任意类型和数量的参数
     *
     * 1. 方法的访问修饰符可以省略
     * 2. 返回值可以使用`*`号代替（任意返回值类型）
     * 3. 包名可以使用`*`号代替，代表任意包（一层包使用一个`*`）
     * 4. 使用`..`配置包名，标识此包以及此包下的所有子包
     * 5. 类名可以使用`*`号代替，标识任意类
     * 6. 方法名可以使用`*`号代替，表示任意方法
     * 7. 可以使用 `*`  配置参数，一个任意类型的参数
     * 8. 可以使用`..` 配置参数，任意个任意类型的参数
     */
    /**
     * 省略方法的修饰符号 ,使用`*`代替返回值类型,使用`*`代替包名（一层包使用一个`*`）
     * execution(* com.itheima.*.*.DeptServiceImpl.delete(java.lang.Integer))
     * 使用`..`省略包名,使用`*`代替类名
     * execution(* com..*.delete(java.lang.Integer))
     * 使用`*`代替方法名,使用 `*` 代替参数,使用`..`省略参数
     * execution(* com..*.*(..))
     *
     * 根据业务需要，可以使用 且（&&）、或（||）、非（!） 来组合比较复杂的切入点表达式。
     *execution(* com.itheima.service.DeptService.list(..)) || execution(* com.itheima.service.DeptService.delete(..))
     *
     * 在满足业务需要的前提下，尽量缩小切入点的匹配范围。如：包名匹配尽量不使用 ..，使用 * 匹配单个包
     * execution(* com.itheima.*.*.DeptServiceImpl.find*(..))
     *
     */
    /**
     * execution切入点表达式
     *
     * - 根据我们所指定的方法的描述信息来匹配切入点方法，这种方式也是最为常用的一种方式
     * - 如果我们要匹配的切入点方法的方法名不规则，或者有一些比较特殊的需求，通过execution切入点表达式描述比较繁琐
     *
     */

    @Pointcut("execution(public void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")
    private void pt(){}


    @Before("pt()")
    public void before()
    {
        log.info("MyAspect6 ...before ...");
    }
}
